package com.naiterui.ehp.bs.ds.common.utils;

import java.awt.image.BufferedImage;
import java.util.HashMap;
import java.util.Map;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.oned.Code128Writer;

import lombok.extern.slf4j.Slf4j;

/**
 * <pre>
 *      条形码工具类
 * </pre>
 *
 * @author 王泽浩
 * @date 2019-07-12 14:08
 * @since 1.0.0
 */
@Slf4j
public class BarCodeUtil {

    /**
     * 条形码编码
     */
    public static BufferedImage encode(String contents) {

        //配置条码参数
        Map<EncodeHintType, Object> hints = new HashMap<>();
        //设置条码两边空白边距为0，默认为10，如果宽度不是条码自动生成宽度的倍数则MARGIN无效
        hints.put(EncodeHintType.MARGIN, 0);

        //为了无边距，需设置宽度为条码自动生成规则的宽度
        int width = new Code128Writer().encode(contents).length;
        //前端可控制高度，不影响识别
        int height = 70;
        //条码放大倍数
        int codeMultiples = 1;
        //获取条码内容的宽，不含两边距，当EncodeHintType.MARGIN为0时即为条码宽度
        int codeWidth = width * codeMultiples;

        try {
            // 图像数据转换，使用了矩阵转换 参数顺序分别为：编码内容，编码类型，生成图片宽度，生成图片高度，设置参数
            BitMatrix bitMatrix = new Code128Writer().encode(contents, BarcodeFormat.CODE_128, codeWidth, height, hints);
            return MatrixToImageWriter.toBufferedImage(bitMatrix);
        } catch (Exception e) {
            log.error("条形码生成失败 contents：{}", contents, e);
            throw new RuntimeException("条形码生成失败");
        }
    }
}
